Technical Q&A QA1134
Programmatically causing restart, shutdown and/or logout


Q: Mac OS 9 Ç‹ÇΩÇÕ Mac OS X Ç™â“ìÆÇ∑ÇÈÉ}ÉVÉìÇÃÉVÉXÉeÉÄèIóπÅAçƒãNìÆÅAÉXÉäÅ[ÉvÅAÉçÉOÉAÉEÉgÇÉvÉçÉOÉâÉ~ÉìÉOÇ≈çsǧDžÇÕǫǧǵÇΩÇÁÇÊÇ¢Ç≈Ç∑Ç©ÅH

A: DZÇÍÇÁÇÕÇ∑Ç◊ǃÅAì¡íËÇÃÉAÉbÉvÉãÉCÉxÉìÉgÇ Macintosh ÇÃÉVÉXÉeÉÄÉvÉçÉZÉXÇ…ëóÇÈDZÇΔÇ…ÇÊÇËé¿çsÇ≈Ç´Ç‹Ç∑ÅBÉVÉXÉeÉÄÉvÉçÉZÉXÇÕÅAÉAÉbÉvÉãÉCÉxÉìÉgÇâéflǵǃóvãÅÇ≥ÇÍÇΩÉCÉxÉìÉgÇî≠ê∂Ç≥ÇπÇ‹Ç∑ÅBMac OS 9 Ç≈ÇÕÅAFinder Ç™ÉVÉXÉeÉÄÉvÉçÉZÉXÇ≈ǵÇΩÅBMac OS X Ç≈ÇÕÅAÉçÉOÉCÉìÉEÉCÉìÉhÉEÇ™ÉVÉXÉeÉÄÉvÉçÉZÉXÇΔÇ»ÇËÇ‹Ç∑ÅBÉ^Å[ÉQÉbÉgÉAÉvÉäÉPÅ[ÉVÉáÉìÇà ProcessSerialNumber ÇΔǵǃíËêî {0,kSystemProcess} ÇégǡǃÅAÉAÉbÉvÉãÉCÉxÉìÉgÇÃÉ^Å[ÉQÉbÉgÇÉVÉXÉeÉÄÉvÉçÉZÉXÇ…ê›íËÇ≈Ç´Ç‹Ç∑ÅBDZÇÃï˚ñ@Ç≈äJénǵÇΩçƒãNìÆÅAÉVÉXÉeÉÄèIóπÅAÉçÉOÉAÉEÉgÇÃÉVÅ[ÉPÉìÉXÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇé¿çsÇ∑ÇÈDZÇΔÇ…ÇÊǡǃÉLÉÉÉìÉZÉãÇ≈Ç´Ç‹Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÇÊÇÈçƒãNìÆ/ÉVÉXÉeÉÄèIóπ/ÉçÉOÉAÉEÉgÇÃÉVÅ[ÉPÉìÉXÇÉLÉÉÉìÉZÉãÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃè⁄ç◊DžǬǢǃÇÕÅASystem Overview Çà ÅuTerminating ProcessesÅvÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB

èdóvÅF
çƒãNìÆÅAÉVÉXÉeÉÄèIóπÅAÉXÉäÅ[ÉvÅAÉçÉOÉAÉEÉgÇÃÉCÉxÉìÉgÇÃäJénÇÕÅAǫǧǵǃLJïKóvÇ»èÍçáÇ…å¿ÇËçsǧÇ◊Ç´Ç≈Ç∑ÅBÇ‹ÇΩÅADZÇÍÇÁÇÃÉAÉNÉVÉáÉìÇÕÅAÉÜÅ[ÉUÇÃìØà”ÇìæÇΩå„Ç…å¿ÇËçsǧïKóvǙdžÇËÇ‹Ç∑ÅB

Mac OS 9 ÇΔ Mac OS X Ç≈ÇÕÅAÉVÉXÉeÉÄÇÃçƒãNìÆÇΔÉVÉXÉeÉÄèIóπÇÕÅAÉAÉbÉvÉãÉCÉxÉìÉgÇà kAERestart ÇΔ kAEShutDown ÇǪÇÍǺÇÍÉVÉXÉeÉÄÉvÉçÉZÉXÇ…ëóÇÈDZÇΔÇ…ÇÊǡǃäJénÇ≈Ç´Ç‹Ç∑ÅBÉAÉbÉvÉãÉCÉxÉìÉgÇëóêMÇ∑ÇÈDZÇΔÇ…ÇÊǡǃÅAçƒãNìÆÇΔÉVÉXÉeÉÄèIóπÇÃÉVÅ[ÉPÉìÉXÇ™äJénǵNjÇ∑ÅB

Ç≥ÇÁÇ… Mac OS X Ç≈ÇÕÅAÉçÉOÉAÉEÉgÇΔÉXÉäÅ[ÉvÇÃÉCÉxÉìÉgÇóòópÇ≈Ç´Ç‹Ç∑ÅBÉçÉOÉAÉEÉgÇΔÉXÉäÅ[ÉvÇÕÅAkAEReallyLogOut ÇΔ kAESleep ÇÃÉCÉxÉìÉgÇÉVÉXÉeÉÄÉvÉçÉZÉXÇ…ëóêMÇ∑ÇÈDZÇΔÇ…ÇÊǡǃäJénÇ≈Ç´Ç‹Ç∑ÅBMac OS X 10.2 à»ëOÇ≈ÇÕÅAkAEReallyLogOut ÇÕÉAÉbÉvÉãÉCÉxÉìÉgÉwÉbÉ_Ç≈ÇÕíËã`Ç≥ÇÍǃǢNjÇπÇÒÇ™ÅAÉTÉ|Å[ÉgÇÕÇ≥ÇÍǃǢNjǵÇΩÅBMac OS X ÇÃà»ëOÇÃÉoÅ[ÉWÉáÉìÇ≈ÇÕÅAkAEReallyLogOut ÇÃë„ÇÌÇËÇ…ÅADZÇÍÇ…ëäìñÇ∑ÇÈï∂éöÉRÅ[Éh 'rlgo' ÇÉRÅ[ÉhÇ≈égópÇ≈Ç´Ç‹Ç∑ÅB

â∫ãLÇÃÉRÅ[ÉhÇ≈ÇÕÅAÉAÉbÉvÉãÉCÉxÉìÉgÇÉVÉXÉeÉÄÉvÉçÉZÉXÇ…ëóÇÈDZÇΔÇ…ÇÊǡǃÉvÉçÉOÉâÉ~ÉìÉOÇ…ÇÊǡǃçƒãNìÆÅAÉVÉÉÉbÉgÉ_ÉEÉìÅAÉXÉäÅ[ÉvÅAÉçÉOÉAÉEÉgÇî≠ê∂Ç≥ÇπÇÈï˚ñ@Çé¶ÇµÇƒÇ¢Ç‹Ç∑ÅBä÷êî SendAppleEventToSystemProcess ÇÕÅAÉAÉbÉvÉãÉCÉxÉìÉgÇÉVÉXÉeÉÄÉvÉçÉZÉXÇ…ëóÇÈñäÑÇâ ÇΩǵNjÇ∑ÅBâ∫ãLÇÃÉ\Å[ÉXÉRÅ[ÉhÇégÇ¡ÇΩäÆëSÇ»ÉvÉçÉWÉFÉNÉgÇÕÅAqa1134.sit É_ÉEÉìÉçÅ[ÉhÇ…ä‹Ç‹ÇÍǃǢNjÇ∑ÅB


int main(void)
{
    const int bufferSize = 256;
    OSStatus error = noErr;
    char select [bufferSize];

    printf("1: Restart computer\n");
    printf("2: Shutdown computer\n");
    printf("3: Logout computer\n");
    printf("4: Sleep computer\n");
    printf("q: quit program\n");

    printf("please enter choice:\n");fflush(stdout);
    fgets(select, bufferSize, stdin);

    switch (select[0])
    {
         case '1':
            // çƒãNìÆÉCÉxÉìÉgÇÉVÉXÉeÉÄÇ…ëóêM
            error = SendAppleEventToSystemProcess(kAERestart);
            if (error == noErr)
                {printf("Computer is going to restart!\n");}
            else
                {printf("Computer wouldn't restart\n");}
         break;
         case '2':
            // ÉVÉXÉeÉÄèIóπÉCÉxÉìÉgÇÉVÉXÉeÉÄÇ…ëóêM
            error = SendAppleEventToSystemProcess(kAEShutDown);
            if (error == noErr)
                {printf("Computer is going to shutdown!\n");}
            else
                {printf("Computer wouldn't shutdown\n");}
         break;
         case '3':
            // ÉçÉOÉAÉEÉgÉCÉxÉìÉgÇÉVÉXÉeÉÄÇ…ëóêM
            error = SendAppleEventToSystemProcess(kAEReallyLogOut);
            if (error == noErr)
                {printf("Computer is going to logout!\n");}
            else
                {printf("Computer wouldn't logout");}
         break;
         case '4':
            // ÉXÉäÅ[ÉvÉCÉxÉìÉgÇÉVÉXÉeÉÄÇ…ëóêM
            error = SendAppleEventToSystemProcess(kAESleep);
            if (error == noErr)
                {printf("Computer is going to sleep!\n");}
            else
                {printf("Computer wouldn't sleep");}
    };

    return(0);
}

OSStatus SendAppleEventToSystemProcess(AEEventID EventToSend)
{
    AEAddressDesc targetDesc;
    static const ProcessSerialNumber
         kPSNOfSystemProcess = { 0, kSystemProcess };
    AppleEvent eventReply = {typeNull, NULL};
    AppleEvent appleEventToSend = {typeNull, NULL};

    OSStatus error = noErr;

    error = AECreateDesc(typeProcessSerialNumber,
        &kPSNOfSystemProcess, sizeof(kPSNOfSystemProcess),
        &targetDesc);

    if (error != noErr)
    {
        return(error);
    }

    error = AECreateAppleEvent(kCoreEventClass, EventToSend,
                     &targetDesc, kAutoGenerateReturnID,
                     kAnyTransactionID, &appleEventToSend);

    AEDisposeDesc(&targetDesc);

    if (error != noErr)
    {
        return(error);
    }

    error = AESend(&appleEventToSend, &eventReply, kAENoReply,
             kAENormalPriority, kAEDefaultTimeout,
             NULL, NULL);

    AEDisposeDesc(&appleEventToSend);

    if (error != noErr)
    {
        return(error);
    }

    AEDisposeDesc(&eventReply);

    return(error); // DZÇÍÇ™ noErr Ç»ÇÁÇŒê≥èÌèIóπ
}

ÉäÉXÉg 1. ÉvÉçÉOÉâÉÄÇ≈ÉVÉXÉeÉÄÇçƒãNìÆÅAÉVÉXÉeÉÄèIóπÅAÉXÉäÅ[ÉvÅAÉçÉOÉAÉEÉgÇ∑ÇÈï˚ñ@


É_ÉEÉìÉçÅ[Éh

qa1134.sit

ÉRÅ[ÉhÉäÉXÉg 1 ÇÃÉ\Å[ÉXÉvÉçÉWÉFÉNÉg (8K)

É_ÉEÉìÉçÅ[Éh



[2003 îN 2 åé 10 ì˙]